/*
 * HostComm.h - 与上位机通信的驱动头文件
 */

#ifndef HOSTCOMM_H_
#define HOSTCOMM_H_

#include "ti_msp_dl_config.h"
#include <stdint.h>
#include <stdbool.h>

// ==============================================================================
// 回调函数类型定义
// ==============================================================================
typedef void (*MotorControlCallback)(uint8_t direction);
typedef void (*SetSpeedCallback)(uint8_t speed);
typedef void (*SetTargetYawCallback)(float yaw);
typedef void (*SetPIDParamsCallback)(float kp, float ki, float kd);


// 数据包帧头
#define HOSTCOMM_HEADER_0   0xAA
#define HOSTCOMM_HEADER_1   0x55
#define HOSTCOMM_MIN_PACKET_LEN 5 // 最小包长: 帧头(2) + 命令(1) + 长度(1) + 校验(1)

// ==============================================================================
// 命令ID定义 (MCU -> 上位机)
// ==============================================================================
#define HOSTCOMM_CMD_GPS_DATA        0x10 // GPS 数据
#define HOSTCOMM_CMD_IMU_DATA        0x11 // IMU 姿态数据
#define HOSTCOMM_CMD_MAG_DATA        0x12 // 磁力计数据
#define HOSTCOMM_CMD_VEHICLE_STATUS  0x13 // 小车状态数据
#define HOSTCOMM_CMD_SYSTEM_HEARTBEAT 0x01 // 系统心跳包
#define HOSTCOMM_CMD_DEBUG_LOG       0xEE // 固件调试日志

// ==============================================================================
// 命令ID定义 (上位机 -> MCU)
// ==============================================================================
#define HOSTCOMM_CMD_MOTOR_CONTROL   0x80 // 运动控制
#define HOSTCOMM_CMD_SET_SPEED       0x81 // 速度设定
#define HOSTCOMM_CMD_SET_TARGET_YAW  0x82 // 目标偏航角设定
#define HOSTCOMM_CMD_SET_PID_PARAMS  0x83 // PID参数设定

// 状态枚举
typedef enum {
    HOSTCOMM_STATUS_SUCCESS = 0,    // 成功
    HOSTCOMM_STATUS_ERROR,          // 通用错误
    HOSTCOMM_STATUS_INVALID_PARAM,  // 无效参数
    HOSTCOMM_STATUS_TX_FAIL,        // 发送失败
} HostComm_Status_t;

// ==============================================================================
// 数据载荷结构体定义 (注意：使用#pragma pack确保字节对齐)
// ==============================================================================
#pragma pack(push, 1)

// GPS数据包 (CMD: 0x10)
typedef struct {
    float longitude;
    float latitude;
    float speed;        // GPS速度
    uint8_t satellites;
} HostComm_GPSData_t;

// IMU数据包 (CMD: 0x11)
typedef struct {
    float pitch;
    float roll;
    float yaw;
} HostComm_IMUData_t;

// 磁力计数据包 (CMD: 0x12)
typedef struct {
    float heading;
} HostComm_MagData_t;

// 小车状态数据包 (CMD: 0x13)
typedef struct {
    int16_t motorL;
    int16_t motorR;
    float battery_voltage;
} HostComm_VehicleStatus_t;

// 系统心跳包 (CMD: 0x01)
typedef struct {
    uint8_t mpu_status;
    uint8_t hmc_status;
    uint8_t gps_status;
} HostComm_SystemHeartbeat_t;

#pragma pack(pop)


// ==============================================================================
// 函数原型声明
// ==============================================================================

/**
 * @brief 初始化HostComm驱动
 */
void HostComm_Init(void);

/**
 * @brief 发送一个标准数据包
 * @param cmd 命令ID
 * @param data 指向数据载荷的指针
 * @param length 数据载荷的长度
 * @return HostComm_Status_t 操作状态
 */
HostComm_Status_t HostComm_SendPacket(uint8_t cmd, const uint8_t *data, uint8_t length);

/**
 * @brief 发送GPS数据
 */
HostComm_Status_t HostComm_SendGPS(float lon, float lat, float speed, uint8_t sats);

/**
 * @brief 发送IMU（姿态）数据
 */
HostComm_Status_t HostComm_SendIMU(float pitch, float roll, float yaw);

/**
 * @brief 发送磁力计（航向角）数据
 */
HostComm_Status_t HostComm_SendMag(float heading);

/**
 * @brief 发送小车状态数据
 */
HostComm_Status_t HostComm_SendVehicleStatus(int16_t motorL, int16_t motorR, float battery);

/**
 * @brief 发送系统心跳
 */
HostComm_Status_t HostComm_SendHeartbeat(bool mpu_ok, bool hmc_ok, bool gps_ok);

/**
 * @brief 发送调试字符串
 */
HostComm_Status_t HostComm_SendDebugString(const char *str);

/**
 * @brief 接收处理函数，应在主循环中定期调用
 */
void HostComm_ReceiveHandler(void);

// ==============================================================================
// 回调函数注册接口
// ==============================================================================

/**
 * @brief 注册运动控制指令的回调函数
 */
void HostComm_RegisterMotorControlCallback(MotorControlCallback callback);

/**
 * @brief 注册速度设定指令的回调函数
 */
void HostComm_RegisterSetSpeedCallback(SetSpeedCallback callback);

/**
 * @brief 注册目标偏航角设定的回调函数
 */
void HostComm_RegisterSetTargetYawCallback(SetTargetYawCallback callback);

/**
 * @brief 注册PID参数设定的回调函数
 */
void HostComm_RegisterSetPIDParamsCallback(SetPIDParamsCallback callback);


#endif /* HOSTCOMM_H_ */ 